package cn.ljy.mes.utils.img;

import cn.ljy.common.exception.model.MyServiceException;
import cn.ljy.common.utils.file.Base64FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;

@Component
public class ImageUtil {
    @Autowired
    private ResourceLoader resourceLoader;

    /**
     *
     * @param resourceImagePath
     * @param x
     * @param y
     * @param content
     * @param fontSize
     * @return
     */
    public String writeImage(String resourceImagePath,int x,int y,String content,int fontSize){
        String img64=null;
        InputStream imageIn=null;//图片资源
        InputStream ttfIn=null;//字体资源
        //方法1：加载 resources 目录下的文件。但是在jar打包后无法读取
        //首先要加载你的图片和字体库。将字体库存放到resource目录底下。
        //缺少字体库会导致图片上的文字变成方框或者不显示。
        //通过文件路径获取
//        InputStream imageIn = new FileInputStream(new File("E:/c.png")
        //通过资源路径读取
        // 加载 resources 目录下的文件。但是在jar打包后无法读取
//        Resource resource = resourceLoader.getResource("classpath:"+resourceImagePath);
//        try {
////
//            File file = resource.getFile();
//            imageIn = new FileInputStream(file);
//            ttfIn = ResourceLoader.class.getResourceAsStream("/仿宋_GB2312.ttf");
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
        //方法2：可以在服务器使用jar运行
        ClassLoader classLoader = getClass().getClassLoader();
        imageIn = classLoader.getResourceAsStream("zhengshu.png");
        ttfIn = classLoader.getResourceAsStream("仿宋_GB2312.ttf");
        try {
            if (null == ttfIn) {
                throw new MyServiceException("字体加载失败！！！");
            }
            BufferedImage bufferedImage = ImageIO.read(imageIn);
            //创建一个新的BufferedImage对象，用于绘制文本
            BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = newBufferedImage.createGraphics();

            //在新的图片上绘制原始图片
            g2d.drawImage(bufferedImage, 0, 0, null);

            //加载字体
            Font font = Font.createFont(Font.TRUETYPE_FONT, ttfIn);
            //设置字体风格和大小
            Font useFont = font.deriveFont(Font.BOLD, fontSize);
//            Font useFont = font.deriveFont(Font.PLAIN, fontSize);

            //要使用字体，必须先注册
            GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
            graphicsEnvironment.registerFont(useFont);

            g2d.setFont(useFont);
            //设置字体颜色
            g2d.setColor(Color.BLACK);

            //可以使用FontMetrics计算字体的长度，用于计算居中
//            FontMetrics fontMetrics = g2d.getFontMetrics();
//            String userName = "张三";
//            int stringWidth = fontMetrics.stringWidth(userName);

            //设置文字在横轴和竖轴的位置,可以使用截图工具获取
            g2d.drawString(content, x, y);

            //生成新图片到指定位置
//            ImageIO.write(newBufferedImage, "png", new File("E:/c1.png"));
            //生成图片为base64
            img64=Base64FileUtil.convertBufferedImageToString(newBufferedImage,getExtension(resourceImagePath));

            //如果需要将图片上传到云存储，比如阿里云，可以将图片转为inputStream上传
//            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//            ImageIO.write(newBufferedImage, "png", outputStream);
//            byte[] byteArray = outputStream.toByteArray();
//            ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
//            upload2Aliyun(inputStream);
            //释放
            g2d.dispose();
        } catch (IOException | FontFormatException e) {
            throw new RuntimeException(e);
        }
        return img64;
    }

    /**
     * 获取图片后缀名，从图片路径
     * @param path
     * @return
     */
    private String getExtension(String path) {
        if (path == null || path.isEmpty()) {
            return null;
        }
        int lastDotIndex = path.lastIndexOf('.');
        if (lastDotIndex > -1 && lastDotIndex < path.length() - 1) {
            return path.substring(lastDotIndex + 1);
        }
        return null; // 没有找到后缀名
    }
}
